# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# NOTE: This file is auto generated by the elixir code generator program.
# Do not edit this file manually.

defmodule GoogleApi.Spanner.V1.Model.Instance do
  @moduledoc """
  An isolated set of Cloud Spanner resources on which databases can be hosted.

  ## Attributes

  *   `autoscalingConfig` (*type:* `GoogleApi.Spanner.V1.Model.AutoscalingConfig.t`, *default:* `nil`) - Optional. The autoscaling configuration. Autoscaling is enabled if this field is set. When autoscaling is enabled, node_count and processing_units are treated as OUTPUT_ONLY fields and reflect the current compute capacity allocated to the instance.
  *   `config` (*type:* `String.t`, *default:* `nil`) - Required. The name of the instance's configuration. Values are of the form `projects//instanceConfigs/`. See also InstanceConfig and ListInstanceConfigs.
  *   `createTime` (*type:* `DateTime.t`, *default:* `nil`) - Output only. The time at which the instance was created.
  *   `defaultBackupScheduleType` (*type:* `String.t`, *default:* `nil`) - Optional. Controls the default backup schedule behavior for new databases within the instance. By default, a backup schedule is created automatically when a new database is created in a new instance. Note that the `AUTOMATIC` value isn't permitted for free instances, as backups and backup schedules aren't supported for free instances. In the `GetInstance` or `ListInstances` response, if the value of `default_backup_schedule_type` isn't set, or set to `NONE`, Spanner doesn't create a default backup schedule for new databases in the instance.
  *   `displayName` (*type:* `String.t`, *default:* `nil`) - Required. The descriptive name for this instance as it appears in UIs. Must be unique per project and between 4 and 30 characters in length.
  *   `edition` (*type:* `String.t`, *default:* `nil`) - Optional. The `Edition` of the current instance.
  *   `endpointUris` (*type:* `list(String.t)`, *default:* `nil`) - Deprecated. This field is not populated.
  *   `freeInstanceMetadata` (*type:* `GoogleApi.Spanner.V1.Model.FreeInstanceMetadata.t`, *default:* `nil`) - Free instance metadata. Only populated for free instances.
  *   `instanceType` (*type:* `String.t`, *default:* `nil`) - The `InstanceType` of the current instance.
  *   `labels` (*type:* `map()`, *default:* `nil`) - Cloud Labels are a flexible and lightweight mechanism for organizing cloud resources into groups that reflect a customer's organizational needs and deployment strategies. Cloud Labels can be used to filter collections of resources. They can be used to control how resource metrics are aggregated. And they can be used as arguments to policy management rules (e.g. route, firewall, load balancing, etc.). * Label keys must be between 1 and 63 characters long and must conform to the following regular expression: `a-z{0,62}`. * Label values must be between 0 and 63 characters long and must conform to the regular expression `[a-z0-9_-]{0,63}`. * No more than 64 labels can be associated with a given resource. See https://goo.gl/xmQnxf for more information on and examples of labels. If you plan to use labels in your own code, please note that additional characters may be allowed in the future. And so you are advised to use an internal label representation, such as JSON, which doesn't rely upon specific characters being disallowed. For example, representing labels as the string: name + "_" + value would prove problematic if we were to allow "_" in a future release.
  *   `name` (*type:* `String.t`, *default:* `nil`) - Required. A unique identifier for the instance, which cannot be changed after the instance is created. Values are of the form `projects//instances/a-z*[a-z0-9]`. The final segment of the name must be between 2 and 64 characters in length.
  *   `nodeCount` (*type:* `integer()`, *default:* `nil`) - The number of nodes allocated to this instance. At most, one of either `node_count` or `processing_units` should be present in the message. Users can set the `node_count` field to specify the target number of nodes allocated to the instance. If autoscaling is enabled, `node_count` is treated as an `OUTPUT_ONLY` field and reflects the current number of nodes allocated to the instance. This might be zero in API responses for instances that are not yet in the `READY` state. If the instance has varying node count across replicas (achieved by setting `asymmetric_autoscaling_options` in the autoscaling configuration), the `node_count` set here is the maximum node count across all replicas. For more information, see [Compute capacity, nodes, and processing units](https://cloud.google.com/spanner/docs/compute-capacity).
  *   `processingUnits` (*type:* `integer()`, *default:* `nil`) - The number of processing units allocated to this instance. At most, one of either `processing_units` or `node_count` should be present in the message. Users can set the `processing_units` field to specify the target number of processing units allocated to the instance. If autoscaling is enabled, `processing_units` is treated as an `OUTPUT_ONLY` field and reflects the current number of processing units allocated to the instance. This might be zero in API responses for instances that are not yet in the `READY` state. If the instance has varying processing units per replica (achieved by setting `asymmetric_autoscaling_options` in the autoscaling configuration), the `processing_units` set here is the maximum processing units across all replicas. For more information, see [Compute capacity, nodes and processing units](https://cloud.google.com/spanner/docs/compute-capacity).
  *   `replicaComputeCapacity` (*type:* `list(GoogleApi.Spanner.V1.Model.ReplicaComputeCapacity.t)`, *default:* `nil`) - Output only. Lists the compute capacity per ReplicaSelection. A replica selection identifies a set of replicas with common properties. Replicas identified by a ReplicaSelection are scaled with the same compute capacity.
  *   `state` (*type:* `String.t`, *default:* `nil`) - Output only. The current instance state. For CreateInstance, the state must be either omitted or set to `CREATING`. For UpdateInstance, the state must be either omitted or set to `READY`.
  *   `updateTime` (*type:* `DateTime.t`, *default:* `nil`) - Output only. The time at which the instance was most recently updated.
  """

  use GoogleApi.Gax.ModelBase

  @type t :: %__MODULE__{
          :autoscalingConfig => GoogleApi.Spanner.V1.Model.AutoscalingConfig.t() | nil,
          :config => String.t() | nil,
          :createTime => DateTime.t() | nil,
          :defaultBackupScheduleType => String.t() | nil,
          :displayName => String.t() | nil,
          :edition => String.t() | nil,
          :endpointUris => list(String.t()) | nil,
          :freeInstanceMetadata => GoogleApi.Spanner.V1.Model.FreeInstanceMetadata.t() | nil,
          :instanceType => String.t() | nil,
          :labels => map() | nil,
          :name => String.t() | nil,
          :nodeCount => integer() | nil,
          :processingUnits => integer() | nil,
          :replicaComputeCapacity =>
            list(GoogleApi.Spanner.V1.Model.ReplicaComputeCapacity.t()) | nil,
          :state => String.t() | nil,
          :updateTime => DateTime.t() | nil
        }

  field(:autoscalingConfig, as: GoogleApi.Spanner.V1.Model.AutoscalingConfig)
  field(:config)
  field(:createTime, as: DateTime)
  field(:defaultBackupScheduleType)
  field(:displayName)
  field(:edition)
  field(:endpointUris, type: :list)
  field(:freeInstanceMetadata, as: GoogleApi.Spanner.V1.Model.FreeInstanceMetadata)
  field(:instanceType)
  field(:labels, type: :map)
  field(:name)
  field(:nodeCount)
  field(:processingUnits)

  field(:replicaComputeCapacity,
    as: GoogleApi.Spanner.V1.Model.ReplicaComputeCapacity,
    type: :list
  )

  field(:state)
  field(:updateTime, as: DateTime)
end

defimpl Poison.Decoder, for: GoogleApi.Spanner.V1.Model.Instance do
  def decode(value, options) do
    GoogleApi.Spanner.V1.Model.Instance.decode(value, options)
  end
end

defimpl Poison.Encoder, for: GoogleApi.Spanner.V1.Model.Instance do
  def encode(value, options) do
    GoogleApi.Gax.ModelBase.encode(value, options)
  end
end
